﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Model;
using Interfaces;

namespace Controller
{
    public class ClsSystemController
    {
        // Instansiering af klasser
        ClsDBFacade dbController;
        ClsMedlemCollection medlemColl;
        ClsKoerereCollection koerereColl;
        ClsTeamsCollection teamsColl;
        ClsGrandPrixCollection grandPrixColl;
        ClsPostByCollection postByColl;
        ClsPointPlaceringCollection pointPlaceringColl;
        ClsSamledeSatsCollection SamledeSatsColl; 

        IClsMedlem aktueltMedlem; /* Session controller til at holde styr på et aktuelt medlemsinterfaceobjekt. Dette bruges i forbindelse med login
                                  hvor vi så kan "fører" interfaceobjektet med rundt på diverse forms */


        public ClsSystemController()
        {
            dbController = new ClsDBFacade(this);
            medlemColl = new ClsMedlemCollection();
            koerereColl = new ClsKoerereCollection();
            teamsColl = new ClsTeamsCollection();
            grandPrixColl = new ClsGrandPrixCollection();
            postByColl = new ClsPostByCollection();
            pointPlaceringColl = new ClsPointPlaceringCollection();
            SamledeSatsColl = new ClsSamledeSatsCollection(); 
            aktueltMedlem = null;
        }

        #region DatabaseDownloads

        public void DownloadKoerereFraDB(string koerereNavn, int koereNummer, int teamNummer)
        {
            ClsTeams mitTeam = null;
            foreach (var item in teamsColl.GetTeams())
            {
                if (item.TeamNummer == teamNummer)
                {
                    mitTeam = (ClsTeams)item;
                }
            }

            koerereColl.DownloadKoerereFraDB(koerereNavn, koereNummer, mitTeam);
        }

        public void DownloadTeamsFraDB(string teamNavn, int teamNummer)
        {
            teamsColl.DownloadTeamsFraDB(teamNavn, teamNummer);
        }

        public void DownloadGrandPrixFraDB(int grandPrixNummer, string land, string baneNavn, DateTime grandPrixDatoTid, int joker, bool afviklet, int autoSatsKoere1, int autoSatsKoere2)
        {
            ClsKoerere minJoker = null;
            foreach (var item in koerereColl.GetKoerere())
            {
                if (item.KoereNummer == joker)
                {
                    minJoker = (ClsKoerere)item;
                }
            }
            grandPrixColl.DownloadGrandPrixFraDB(grandPrixNummer, land, baneNavn, grandPrixDatoTid, minJoker, afviklet, autoSatsKoere1, autoSatsKoere2);
        }

        public void DownloadMedlemFraDB(string navn, string mail, string adresse, string by, int postNummer, int medlemsNummer, bool betalt)
        {
            medlemColl.DownloadMedlemFraDB(navn, mail, adresse, by, postNummer, medlemsNummer, betalt);
        }

        public void DownloadPostByFraDB(int postnummer, string byNavn)
        {
            postByColl.DownloadPostbyFraDB(postnummer, byNavn);
        }

        public void DownloadPointsaetFraDB(int placering, decimal point)
        {
            pointPlaceringColl.DownloadPointsaetFraDB(placering, point);
        }

        public void DownloadMedlemsSamledePointFraDB()
        {
            foreach (var item in medlemColl.ListMedlemmer)
            {

                item.TotalPoint = dbController.DownloadMedlemsSamledePointFraDB(item.MedlemsNummer);
            }
        }

        public string DownloadReglerFraDB()
        {
           return dbController.DownloadReglerFraDB();  
        }

        public void DownloadMedlemSamledeSatsFraDB(string korerNavn, int samledeStemme)
        {
            SamledeSatsColl.OpretSamledeSats(korerNavn, samledeStemme); 
        }

        #endregion

        #region DatabaseUpload

        public void UploadKoereTilDB(string koerereNavn, int koereNummer, IClsTeams koereTeam)
        {
            dbController.UploadKoereTilDB(koerereNavn, koereNummer, koereTeam);
        }

        public void UploadTeamsTilDB(string teamNavn, int teamNummer)
        {
            dbController.UploadTeamsTilDB(teamNavn, teamNummer);
        }

        public void UploadGrandPrixTilDB(int grandPrixNummer, string land, string baneNavn, DateTime grandPrixDatoTid, int joker, bool afviklet, int autoSatsKoere1, int autoSatsKoere2)
        {
            dbController.UploadGrandPrixTilDB(grandPrixNummer, land, baneNavn, grandPrixDatoTid, joker, afviklet, autoSatsKoere1, autoSatsKoere2);
        }

        public void UploadMedlemTilDBNytPostnummer(string navn, string mail, string adresse, string by, int postNummer, string adgangskode)
        {
            dbController.UploadMedlemTilDBNytPostnummer(navn, mail, adresse, by, postNummer, adgangskode);
        }

        public void UploadMedlemTilDBGammeltPostnummer(string navn, string mail, string adresse, int postNummer, string adgangskode)
        {
            dbController.UploadMedlemTilDBGammeltPostnummer(navn, mail, adresse, postNummer, adgangskode);
        }

        public void UploadStemmeTilDB(int medlemsnummer, int grandprixnummer, int koerenummer)
        {

            dbController.UploadStemmeTilDB(medlemsnummer, grandprixnummer, koerenummer);
        }

        public void UploadPlaceringTilDB(int grandPrixNummer, int koereNummer, int placering)
        {
            dbController.UploadPlaceringTilDB(grandPrixNummer, koereNummer, placering);
        }

        public void UploadPointsaetTilDB(int placering, int point)
        {
            dbController.UploadPointsaetTilDB(placering, point);
        }

        public void UploadReglerTilDB(string tekst)
        {
            dbController.UploadReglerTilDB(tekst); 
        }


        #endregion

        #region OpdaterModeller

        public void OpdaterKoerereFraDB()
        {
            dbController.DownloadKoerereFraDB();
        }

        public void OpdaterTeamsFraDB()
        {
            dbController.DownloadTeamsFraDB();
        }

        public void OpdaterGrandPrixFraDB()
        {
            dbController.DownloadGrandPrixFraDB();
        }

        public void OpdaterPostByFraDB()
        {
            dbController.DownloadPostByFraDB();
        }

        public void OpdaterMedlemFraDB()
        {
            dbController.DownloadMedlemFraDB();
        }

        public void OpdaterPointPlaceringFraDB()
        {
            dbController.DownloadPointsaetFraDB();
        }

        public void OpdaterAktueltMedlem(int medlemsnummer)
        {
            foreach (var item in medlemColl.GetMedlemmer())
            {
                if (item.MedlemsNummer == medlemsnummer)
                {
                    aktueltMedlem = item;
                }
            }
        }

        public void OpdaterSamledeSats(int medlemsnummer)
        {
            dbController.DownloadMedlemSamledeSatsFraDB(medlemsnummer); 
        }

        #endregion

        #region ClearLister

        public void ClearGrandPrixListe()
        {
            grandPrixColl.ListGrandPrix.Clear();
        }

        public void ClearKoerereListe()
        {
            koerereColl.ListKoerere.Clear();
        }

        public void ClearMedlemsListe()
        {
            medlemColl.ListMedlemmer.Clear();
        }

        public void ClearTeamsListe()
        {
            teamsColl.ListTeams.Clear();
        }

        public void ClearPostByListe()
        {
            postByColl.PostByListe1.Clear();
        }

        public void ClearPointsaetListe()
        {
            pointPlaceringColl.ListPointPlacering.Clear();
        }

        public void ClearSamledeSatsListe()
        {
            SamledeSatsColl.ListSamledeSats.Clear();
        }

        #endregion

        #region Rediger

        public void RedigerMedlemIDBNytPostnummer(long medlemsnummer, string navn, string mail, string adresse, int postNummer, bool betaling, string byNavn)
        {
            dbController.RedigerMedlemIDBNytPostnummer(medlemsnummer, navn, adresse, postNummer, mail, betaling, byNavn);

        }

        public void RedigerMedlemIDBGammeltPostnummer(long medlemsnummer, string navn, string mail, string adresse, int postNummer, bool betaling)
        {
            dbController.RedigerMedlemIDBGammeltPostnummer(medlemsnummer, navn, adresse, postNummer, mail, betaling);
        }

        public void RedigerKoereIDB(string koereNavn, int koereNummer, IClsTeams koereTeam)
        {
            dbController.RedigerKoereIDB(koereNavn, koereNummer, koereTeam);
        }

        public void RedigerTeamsIDB(string teamNavn, int teamNummer)
        {
            dbController.RedigerTeamIDB(teamNavn, teamNummer);
        }

        public void RedigerGrandPrixIDB(int grandPrixNummer, string land, string bane, DateTime dato, bool afviklet, int joker, int autoSatskoere1, int autoSatsKoere2)
        {
            dbController.RedigerGrandPrixIDB(grandPrixNummer, land, bane, dato, afviklet, joker, autoSatskoere1, autoSatsKoere2);
        }

        public void RedigerPointSaetIDB(int placering, decimal point)
        {
            dbController.RedigerPointSaetIDB(placering, point);
        }

        #endregion

        #region VisLister
        public List<IClsKoerere> VisKoerere()
        {
            return koerereColl.GetKoerere();
        }

        public List<IClsTeams> VisTeams()
        {
            return teamsColl.GetTeams();
        }

        public List<IClsMedlem> VisMedlemmer()
        {
            return medlemColl.GetMedlemmer();
        }

        public List<IClsGrandPrix> VisGrandPrix()
        {
            return grandPrixColl.GetGrandPrix();
        }

        public List<IClsPostBy> VisPostBy()
        {
            return postByColl.GetPostby();
        }

        public IClsGrandPrix VisNaesteGrandPrix()
        {
            return grandPrixColl.GetNaesteGrandPrix();
        }

        public List<IClsPointPlacering> VisPointPlacering()
        {
            return pointPlaceringColl.GetPointPlacering();
        }

        public List<IClsSamledeSats> VisSamledeSats()
        {
            return SamledeSatsColl.GetSamledeSats(); 
        }

        #endregion

        #region Login/Logaf
        public void MedlemLogin(int medlemsnummer, string adgangskode)
        {
            int godkendelse = dbController.MedlemLogin(medlemsnummer, adgangskode);

            foreach (var item in medlemColl.GetMedlemmer())
            {
                if (item.MedlemsNummer == godkendelse)
                {
                    aktueltMedlem = item;
                }
            }
        }

        public void MedlemLogaf()
        {
            aktueltMedlem = null;
        }

        #endregion

        public IClsMedlem AktueltMedlem
        {
            get { return aktueltMedlem; }
        }

        #region CheckStemme

        public bool CheckStemmeIDB(int medlemsnummer, int grandprixnummer)
        {
            return dbController.CheckStemme(medlemsnummer, grandprixnummer);
        }

        public bool CheckStemme(int medlemsnummer, int grandprixnummer)
        {
            //Checker i Databasen om et medlem har stemt, hvis medlemmet har stemt, må han ikke stemme igen.
            bool checkStemme = false;

            foreach (var item in grandPrixColl.ListGrandPrix)
            {
                if (aktueltMedlem.MedlemsNummer == medlemsnummer && item.GrandPrixNummer == grandprixnummer)
                {
                    checkStemme = true; 
                }
            }
            return checkStemme;
        }

        #endregion
    }
}
